<?php
/**
 * 后台管理系统配置文件
 * 包含数据库配置、安全设置等
 */

// 数据库配置
define('DB_HOST', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'fastadmin');
define('DB_CHARSET', 'utf8mb4');

// 安全配置
define('SESSION_TIMEOUT', 8 * 3600); // 会话超时时间（8小时）
define('MAX_LOGIN_ATTEMPTS', 5); // 最大登录尝试次数
define('LOGIN_LOCKOUT_TIME', 15 * 60); // 登录锁定时间（15分钟）
define('PASSWORD_MIN_LENGTH', 6); // 密码最小长度

// 系统配置
define('SITE_NAME', '后台管理系统');
define('SITE_VERSION', '1.0.0');
define('ADMIN_EMAIL', 'admin@example.com');

// 文件上传配置
define('UPLOAD_MAX_SIZE', 10 * 1024 * 1024); // 最大上传文件大小（10MB）
define('UPLOAD_ALLOWED_TYPES', ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx']);
define('UPLOAD_PATH', '../uploads/');

// 日志配置
define('LOG_ENABLED', true);
define('LOG_PATH', '../logs/');
define('LOG_LEVEL', 'INFO'); // DEBUG, INFO, WARNING, ERROR

// 时区设置
date_default_timezone_set('Asia/Shanghai');

// 错误报告设置
if (defined('ENVIRONMENT') && ENVIRONMENT === 'production') {
    error_reporting(0);
    ini_set('display_errors', 0);
} else {
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
}

// 安全头部设置
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: DENY');
header('X-XSS-Protection: 1; mode=block');
header('Referrer-Policy: strict-origin-when-cross-origin');

// 数据库连接函数
function getDBConnection() {
    static $pdo = null;
    
    if ($pdo === null) {
        try {
            $dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET;
            $pdo = new PDO($dsn, DB_USERNAME, DB_PASSWORD, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false,
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES " . DB_CHARSET
            ]);
        } catch (PDOException $e) {
            error_log("数据库连接失败: " . $e->getMessage());
            die("数据库连接失败，请检查配置");
        }
    }
    
    return $pdo;
}

// 安全检查函数
function checkSecurity() {
    // 检查会话是否过期
    if (isset($_SESSION['admin_login_time']) && 
        (time() - $_SESSION['admin_login_time']) > SESSION_TIMEOUT) {
        session_destroy();
        header('Location: ../login.html');
        exit;
    }
    
    // 检查IP地址是否变化
    if (isset($_SESSION['admin_ip']) && $_SESSION['admin_ip'] !== $_SERVER['REMOTE_ADDR']) {
        session_destroy();
        header('Location: ../login.html?error=ip_changed');
        exit;
    }
    
    // 检查用户代理是否变化
    if (isset($_SESSION['admin_useragent']) && 
        $_SESSION['admin_useragent'] !== ($_SERVER['HTTP_USER_AGENT'] ?? '')) {
        session_destroy();
        header('Location: ../login.html?error=useragent_changed');
        exit;
    }
}

// 日志记录函数
function writeLog($level, $message, $context = []) {
    if (!LOG_ENABLED) return;
    
    $logFile = LOG_PATH . date('Y-m-d') . '.log';
    $timestamp = date('Y-m-d H:i:s');
    $level = strtoupper($level);
    
    $logMessage = "[{$timestamp}] [{$level}] {$message}";
    if (!empty($context)) {
        $logMessage .= " " . json_encode($context, JSON_UNESCAPED_UNICODE);
    }
    $logMessage .= PHP_EOL;
    
    // 确保日志目录存在
    if (!is_dir(LOG_PATH)) {
        mkdir(LOG_PATH, 0755, true);
    }
    
    file_put_contents($logFile, $logMessage, FILE_APPEND | LOCK_EX);
}

// 输入过滤函数
function sanitizeInput($input) {
    if (is_array($input)) {
        return array_map('sanitizeInput', $input);
    }
    return htmlspecialchars(trim($input), ENT_QUOTES, 'UTF-8');
}

// CSRF令牌生成和验证
function generateCSRFToken() {
    if (!isset($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

function validateCSRFToken($token) {
    return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
}

// 密码哈希函数
function hashPassword($password, $salt = null) {
    if ($salt === null) {
        $salt = bin2hex(random_bytes(16));
    }
    return [
        'hash' => password_hash($password . $salt, PASSWORD_DEFAULT),
        'salt' => $salt
    ];
}

// 验证密码函数
function verifyPassword($password, $hash, $salt) {
    return password_verify($password . $salt, $hash);
}

// 生成随机字符串
function generateRandomString($length = 32) {
    return bin2hex(random_bytes($length / 2));
}

// 检查文件类型
function isAllowedFileType($filename) {
    $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
    return in_array($extension, UPLOAD_ALLOWED_TYPES);
}

// 检查文件大小
function isAllowedFileSize($filesize) {
    return $filesize <= UPLOAD_MAX_SIZE;
}

// 获取客户端真实IP
function getClientIP() {
    $ipKeys = ['HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'];
    
    foreach ($ipKeys as $key) {
        if (array_key_exists($key, $_SERVER) === true) {
            foreach (explode(',', $_SERVER[$key]) as $ip) {
                $ip = trim($ip);
                if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) {
                    return $ip;
                }
            }
        }
    }
    
    return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
}

// 初始化会话安全设置
function initSecureSession() {
    // 设置安全的会话参数
    ini_set('session.cookie_httponly', 1);
    ini_set('session.cookie_secure', isset($_SERVER['HTTPS']));
    ini_set('session.use_strict_mode', 1);
    ini_set('session.cookie_samesite', 'Strict');
    
    // 设置会话名称
    session_name('ADMIN_SESSION');
    
    // 启动会话
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    
    // 生成新的会话ID（防止会话固定攻击）
    if (!isset($_SESSION['admin_id'])) {
        session_regenerate_id(true);
    }
}

// 自动加载配置
initSecureSession(); 